// 组件对象
const components:  Record<string, any> = {}

// 使用 Vite 的 import.meta.glob 同步加载 ./elements/ 目录下的所有 view.vue 文件 eager: true
const viewFilesList = import.meta.glob<{default: any}>("./**/view.vue", { eager: true })

// 提取组件名称的函数
const extractComponentName = (filePath: string) => {
  // 从路径中提取最后一个非文件名的目录名
  const pathParts = filePath.split('/')

  // 查找倒数第二个部分（排除文件名和可能的最后一个空部分）
  const nameIndex = pathParts.length - 2
  return nameIndex >= 0 ? pathParts[nameIndex] : filePath
}

// 使用更现代的forEach和结构赋值
Object.entries(viewFilesList).forEach(([filePath, module]) => {
  const name = extractComponentName(filePath)
  if (name && module.default) {
    components[name] = module.default
  }
})




/**
 * 加载组件
 * @param {String} componentName 组件名称
 */
const loadComponent = (componentName: string) => {
  // 检查 name 是否存在且 components 中有对应的组件
  if (componentName && components[componentName]) {
    // 返回匹配的组件
    return components[componentName]
  }
  // 如果没有匹配的组件，返回 null（不渲染）
  return null;
}


// 组件配置对象
const componentsConfig: { [key: string]: any } = {}; 

// 使用 Vite 的 import.meta.glob 同步加载 ./elements/ 目录下的所有 config.vue 文件 eager: true
const configFilesList = import.meta.glob("./**/config.vue", { eager: true })

// 遍历 组件配置 对象，提取文件名并存储组件
for (let [key, value] of Object.entries(configFilesList)) {
  let name = key.slice(key.indexOf('/') + 1, key.lastIndexOf("/"));
  componentsConfig[name] = value.default;
}

/**
 * 加载组件
 * @param {String} componentName 组件名称
 */
const loadComponentConfig = (componentName: string) => {
  // 检查 name 是否存在且 components 中有对应的组件
  if (componentName && componentsConfig[componentName]) {
    return componentsConfig[componentName]; // 返回匹配的组件
  }
  // 如果没有匹配的组件，返回 null（不渲染）
  return null;
}


const componentsConfigOption: Record<string, any> = {}

// 组件配置选项
const configOptionList = import.meta.glob('./**/config.ts')

for (let [key, value] of Object.entries(configOptionList)) {
  // 模块名称
  let name = key.slice(key.indexOf('/') + 1, key.lastIndexOf("/"));

  // 动态导入模块
  const module = await value();

  // 获取模块内容
  componentsConfigOption[name] = module.default || module;
}


// 组件菜单
const componentsMenuConfig = [
  {
    name: "main",
    title: "基础组件",
    hidden:  true,
    list: []
  },
  {
    name: "subform",
    title: "子表单组件",
    hidden:  true,
    list: []
  },
  {
    name: "aide",
    title: "辅助组件",
    hidden:  true,
    list: []
  },
  {
    name: "layout",
    title: "布局组件",
    hidden:  true,
    list: []
  }
]


// 组件菜单配置
for (let [key, value] of Object.entries(componentsConfigOption)) {
  componentsMenuConfig.forEach((val, idx) => {
      if (val.name === value.group) {
        val.list.push(value)
      }
  })
}

interface SquareConfig {
  color?: string
  width?: number
  [propName: string]: any
}
function createSquare(config: SquareConfig) {
}

let mySquare = createSquare({ colour: "red", width: 100, widths: 100 })

export {
    components,
    loadComponent,
    componentsConfig,
    loadComponentConfig,
    componentsConfigOption,
    componentsMenuConfig
}
